/**
 * Created by zz on 2017/4/24.
 */
var utils = (function () {

    /**
     * 动态计算rem
     */
    function countRem(desW) {
        var desW = desW || 750,
            winW = document.documentElement.clientWidth;
        document.documentElement.style.fontSize = winW / desW * 100 + "px";
    }

    /**
     * time 获取验证码
     * @param ele 当前要点击的元素
     * @param wait 倒计时时间
     */
    var wait = 60;

    function time(ele, value) {
        if (wait == 0) {
            wait = 60;
            ele.removeClass("zz-codeBg");
            ele.removeAttr("disabled");
            ele.val("获取验证码");
        } else {
            if (value) {
                ele.val("(" + wait + "s)重新发送");
            } else {
                ele.val(wait + "s");
            }

            wait--;
            setTimeout(function () {
                if (value) {
                    time(ele, value)
                } else {
                    time(ele)
                }

            }, 1000);
            ele.addClass("zz-codeBg");
            ele.attr("disabled", "disabled");
        }
    }

    /**
     * removeSpace 去除符号
     * @param ele 要去除符号的字符串 type string
     * @param symbol 要去除符号
     * @returns {string} 返回去除完符号的字符串
     */
    function removeSpace(ele, symbol) {
        if (!symbol) {
            symbol = " ";//如果没传symbol就是空格
        }
        var symbolReg = "/[" + symbol + "]/g";
        symbolReg = eval(symbolReg);
        var removeSymbol = ele.replace(symbolReg, "");
        return removeSymbol
    }

    /**
     * comma 添加分隔，逗号
     * @param num 要添加的数字 type string
     * @returns {string} 返回添加逗号的字符串
     */
    function comma(num) {
        num = num.toString();
        if (num == "") {
            return "";
        }
        var decimal = num.split(".");//如果传进来是小数就截取整数部分添加逗号
        num = decimal[0].split('').reverse().join('');
        if (decimal[1]) {//如果存在小数 就加上小数部位
            return num.match(/\d{1,3}/g).join(',').split('').reverse().join('') + "." + decimal[1];
        } else {
            return num.match(/\d{1,3}/g).join(',').split('').reverse().join('')
        }
    }

    /**
     * calculation 加减乘除计算
     * @param num1 要添加的数字1
     * @param num2 要添加的数字2
     * @param type 计算的方式 type string “ + - * / ”
     * @param fixed 保留几位小数
     * @returns {string} result 返回及计算结果
     */
    function calculation(num1, num2, type, fixed) {
        var n1, n2, m, result;
        try {
            n1 = num1.toString().split(".")[1].length;
        }
        catch (e) {
            n1 = 0;
        }
        try {
            n2 = num2.toString().split(".")[1].length;
        }
        catch (e) {
            n2 = 0;
        }
        m = Math.pow(10, Math.max(n1, n2));//做10的取小数点后几位的最大长度次幂
        switch (type) {
            case "+":
                result = ((num1 * m) + (num2 * m)) / m;
                break;
            case "-":
                result = ((num1 * m) - (num2 * m)) / m;
                break;
            case "*":
                result = ((num1 * m) * (num2 * m)) / (m * m);
                break;
            case "/":
                result = ((num1 * m) / (num2 * m));
                break;
        }
        if (fixed) {
            return result.toFixed(fixed);
        } else {
            return result;
        }
    }

    /**
     * phoneFormat 手机变换344格式
     * @param ele 要变换的元素 type string
     */
    function phoneFormat(ele) {
        return ele.replace(/\B(?=(?:\d{4})+$)/g, ' ');
    }

    /**
     * cardFormat 银行卡变换每4位加空格
     * @param ele 要变换的元素 type string
     */
    function cardFormat(ele) {
        return ele.replace(/(\d{4})(?!\s)/g, '$1 ')
    }

    /**
     * effectiveCard 判断是否是有效银行卡卡号格式 16 19位
     * @param ele   要判断的元素字符串 type string
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function effectiveCard(ele, button) {
        //先去除空格
        var s = removeSpace(ele);

        var cardNum = /^(\d{16}|\d{17}|\d{18}|\d{19}|\d{20})$/;
        if (!cardNum.test(s)) {
            newModalPrompt('您输入的卡号格式有误！', button);
            return false;
        } else {
            return true
        }
    }

    /**
     * effectiveName 判断是否是有效姓名格式  汉字长度五位  英文长度10位
     * @param ele 要判断的元素字符串 type string
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function effectiveName(ele, button) {
        //判断姓名 英文长度不能超过20，中文长度不能超过10
        var yingwen = /^[A-Za-z]+$/;
        var payeeName = /^([\u4E00-\u9FA5]+?)+$/;
        if (payeeName.test(ele)) {
            if (ele.length > 10) {
                newModalPrompt('请输入正确的姓名！', button);
                return false;
            } else if (ele.length < 2) {
                newModalPrompt('请输入正确的姓名！', button);
                return false;
            } else {
                return true;
            }
        } else if (yingwen.test(ele)) {
            if (ele.length > 20) {
                newModalPrompt('请输入正确的姓名！', button);
                return false;
            } else if (ele.length < 2) {
                newModalPrompt('请输入正确的姓名！', button);
                return false;
            } else {
                return true;
            }
        } else {
            newModalPrompt('请输入正确的姓名！', button);
            return false;
        }
    }

    /**
     * 判断是否是有效身份证格式
     * @param ele 要判断的元素字符串 type string
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function effectiveId(ele, button) {
        var idNum = /^[1-9]\d{5}[1-9]\d{3}((0\d)|(1[0-2]))(([0|1|2]\d)|3[0-1])\d{3}([0-9]|X|x)$/;
        if (!idNum.test(ele)) {
            newModalPrompt('请输入正确的身份证号码！', button);
            return false;
        } else {
            return true;
        }
    }

    /**
     * effectiveMail 验证邮箱
     * @param ele 输入的字符串
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function effectiveMail(ele, button) {
        var mail = /^([a-zA-Z0-9_-])+@([a-zA-Z0-9_-])+(.[a-zA-Z0-9_-])+/;
        if (!mail.test(ele)) {
            newModalPrompt('请输入正确的邮箱！', button);
            return false;
        } else {
            return true;
        }
    }

    /**
     * effectivePhone 判断是否是有效手机号
     * @param ele    要判断的元素字符串 type string
     * @param button  禁止操作的button
     * @param callback 是有效手机号的时候的回调函数
     * @param callbackEle  回调函数的参数
     */
    function effectivePhone(ele, button, callback, callbackEle) {
        //先去除空格 再正则判断手机号是否有效，如果无效 则不跳转页面
        var s = removeSpace(ele);
        var myreg = /^1[123456789]\d{9}$/;
        if (!myreg.test(s)) {
            newModalPrompt('请输入有效的手机号码！', button);
            return false;
        } else {
            if (callback == undefined) {
                return true;
            } else {
                callback(callbackEle);
                return true;
            }
        }
    }

    /**
     * effectiveNum 有效验证码格式
     * @param ele 验证码框输入的字符串 string
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function effectiveNum(ele, button) {
        var num = /^\d{6}$/;
        if (!num.test(ele)) {
            newModalPrompt('请输入有效的验证码！', button);
            return false
        } else {
            return true;
        }
    }

    /**
     * changeValue input框变化
     * @param inputs input的一个集合
     * @param changBg 需要改变的元素
     * @param bg 需要改变的元素的样式的标签名称 type string
     */
    function changeValue(inputs, changBg, bg) {
        inputs.change(function () {
            var flag = true;
            inputs.each(function () {
                if ($(this).val() == "") {
                    flag = false;
                    return;
                }
            });
            if (flag) {
                changBg.addClass(bg)
            } else {
                changBg.removeClass(bg)
            }
        })
    }

    /**
     * queryURLParameter 解析地址
     * @param url 地址
     * @returns {{}} 返回地址上的参数 对象 key=value
     */
    function queryURLParameter(url) {
        //url = url || decodeURIComponent(window.location.href);//->不传递URL我们就获取当前页面的URL地址
        url = url || window.location.href;
        var obj = {},
            reg = /([^?&=]+)=([^?&=]+)/g,
            res = reg.exec(url);
        while (res) {
            obj[res[1]] = decodeURIComponent(res[2]);//转码
            res = reg.exec(url);
        }
        return obj;
    }

    /**
     * getToday 获取当天日期
     * @returns {string} 返回的是当天日期
     */
    function getToday() {
        var date = new Date;
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        var day = date.getDate();
        month = (month < 10 ? "0" + month : month);
        day = (day < 10 ? "0" + day : day);
        var today = (year.toString() + month.toString() + day.toString());
        return today
    }

    /**
     * dateList 获取当前月份的前几个月份
     * @param sDate 前几个月份的数量
     * @returns {string|*} 返回前几个月
     */
    function dateList(sDate) {
        var date = new Date();
        date.setMonth(date.getMonth() - sDate);
        var year = date.getFullYear();
        var month = date.getMonth() + 1;
        month = (month < 10 ? "0" + month : month);
        var startDate = (year.toString() + '' + month.toString() + "01");

        return startDate;
    }

    /**
     * week 获取周
     * @param date 传递的年月日 yyyymmdd格式
     * @returns {string} 返回的 星期几
     */
    function week(date) {
        var sdate = new Date(date.slice(0, 4), parseInt(date.slice(4, 6)) - 1, date.slice(6, 8));
        sdate.getDay();  //就是星期几
        var ary = ["日", "一", "二", "三", "四", "五", "六"];
        var day = ary[sdate.getDay()];
        return "周" + day;
    }

    /**
     * GetDateStr 获取今天或者前几天或者后几天的日期
     * @param AddDayCount 获取AddDayCount天 后的日期  可以为负数 type number 负数 是前几天 正数是后几天
     * @returns {string} 返回yyyymmdd
     * @constructor
     */
    function getDateStr(AddDayCount) {
        var date = new Date();
        date.setDate(date.getDate() + AddDayCount);//获取AddDayCount天后的日期
        var y = date.getFullYear();
        var m = (date.getMonth() + 1) < 10
            ? "0" + (date.getMonth() + 1)
            : (date.getMonth() + 1);//获取当前月份的日期
        var d = date.getDate() < 10 ? "0" + date.getDate() : date.getDate();

        return y + "" + m + "" + d;
    }

    /**
     * ajaxUrl 获取ajaxUrl
     * @returns {urlstr} 返回ajax地址
     */
    function ajaxUrl() {
        //先获取地址
        var urlstr = queryURLParameter();
        if (urlstr.redirect_uri == undefined) {
            urlstr = decodeURIComponent(window.location.href);
        } else {
            urlstr = urlstr.redirect_uri;
        }
        urlstr = urlstr.slice(0, urlstr.indexOf('umfWeChatPlat')) + "umfWeChatPlat/";
        return urlstr;
        //return "http://10.10.67.77:8180/umfWeChatPlat/";
    }

    /**
     * hideMenu 隐藏微信分享菜单
     */
    function hideMenu() {
        document.addEventListener('WeixinJSBridgeReady', function onBridgeReady() {
            //默认隐藏微信右上角菜单按钮
            WeixinJSBridge.call('hideOptionMenu');
        }, false);
    }


    //二期增加
    /**
     * cutOut 截取数字后四位
     * @param bankAccount 需要截取的字符串
     */
    function cutOut(bankAccount) {
        return bankAccount.slice(bankAccount.length - 4, bankAccount.length);
    }

    /**
     * decimalPlaces 小数位数后两位
     * @param num 需要判断的数字
     * @param button  禁止操作的button
     * @param prompt  提示
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function decimalPlaces(num, button, prompt) {
        //var regex = /^([1-9])([0-9]+)(.[0-9]{1,2})?)$/;
        prompt = prompt || '请输入正确的提现金额！';
        var regex = /^([1-9]\d{0,9})(\.\d{1,2})?$/;
        if (!regex.test(num)) {
            newModalPrompt(prompt, button);
            return false
        } else {
            return true;
        }
    }

    /**
     * newModalPrompt toast提示
     * @param content 弹框内容
     * @param button  禁止操作的button
     * @returns {boolean} 匹配返回->true 不匹配返回->false
     */
    function newModalPrompt(content, button) {
        new $.modal({
            content: content,//弹框内容
            showcontent: true//false为弹出框组件二，true为弹出框组件一
        }).show(button);
    }

    /**
     * newModalAnimationShow 加载中显示
     * @param content 弹框内容
     */
    function newModalAnimationShow(content) {
        new $.modal({
            content: content,//弹框内容
            animation: true//调用动画
        }).show();
    }

    /**
     * newModalAnimationHide 加载中隐藏
     * @param time 隐藏时间
     */
    function newModalAnimationHide(time) {
        new $.modal({
            animation: true//调用动画
        }).hide(time);
    }

    function getUrl(url) {
        url = url || window.location.href;
        window.location.href = url;
    }

    /**
     * error 错误页面
     * @param img 错误的图片地址 1 2
     * @param error 错误的图片地址 1 2
     */
    function error(img, error) {
        var str = "";
        str = '<div class="container">'
            + '<div class="error-img">'
            + "<img src=" + '../../image/h5/' + img + " />"
            + '</div>'
            + '<p class="error-txt">' + error + '</p>'
            + '<div class="error-btn">'
            + '<input type="button" value="刷新试试" onclick="utils.getUrl()" />'
            + '</div>'
            + '</div>';
        $("body").html(str).css("background", "#eee");
    }

    /**
     * error interceptDate 截取日期
     * @param date 日期字符串
     * @param type 截取类型
     * @param yearMonth 是截取year 还是month
     * @param type1 什么类型拼接
     * @param type2 什么类型拼接
     * @param type3 什么类型拼接
     */
    function interceptDate(date, type, yearMonth, type1, type2, type3) {
        var dateSplit = date.split(type);
        var dateList = "";
        if (yearMonth == "year") {
            if (type1 == undefined) {
                dateList = dateSplit[0] + dateSplit[1]
            } else if (type2 == undefined) {
                dateList = dateSplit[0] + type1 + dateSplit[1] + type1 + dateSplit[2]
            } else if (type3 == undefined) {
                dateList = dateSplit[0] + type1 + dateSplit[1] + type2
            } else {
                dateList = dateSplit[0] + type1 + dateSplit[1] + type2 + dateSplit[2] + type3
            }
        }
        if (yearMonth == "month") {
            if (type2 == undefined) {
                dateList = dateSplit[1] + type1 + dateSplit[2]
            } else {
                dateList = dateSplit[1] + type1 + dateSplit[2] + type2
            }
        }
        return dateList;
    }

    return {
        countRem: countRem,
        time: time,
        removeSpace: removeSpace,
        phoneFormat: phoneFormat,
        cardFormat: cardFormat,
        effectiveCard: effectiveCard,
        effectiveName: effectiveName,
        effectiveId: effectiveId,
        effectivePhone: effectivePhone,
        effectiveNum: effectiveNum,
        changeValue: changeValue,
        queryURLParameter: queryURLParameter,
        getToday: getToday,
        dateList: dateList,
        effectiveMail: effectiveMail,
        week: week,
        getDateStr: getDateStr,
        ajaxUrl: ajaxUrl,
        hideMenu: hideMenu,
        cutOut: cutOut,
        decimalPlaces: decimalPlaces,
        newModalPrompt: newModalPrompt,
        newModalAnimationShow: newModalAnimationShow,
        newModalAnimationHide: newModalAnimationHide,
        comma: comma,
        calculation: calculation,
        error: error,
        getUrl: getUrl,
        interceptDate: interceptDate
    }
})();